package cn.da.shuai.cool.mybatis.service;

import cn.da.shuai.cool.common.entity.UpdateBase;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface ICoolService<T> extends IService<T> {


    /**
     * 根据指定的类获取对应类型的列表。
     *
     * @param clazz 需要获取的列表元素的类类型
     * @param <P>   泛型参数，表示返回列表中元素的类型
     * @return 返回包含指定类类型元素的列表
     */
    <P> List<P> getList(Class<P> clazz);

    /**
     * 获取列表。
     *
     * @param param 参数，用于生成列表的依据
     * @param <S>   泛型参数，表示传入参数的类型
     * @return 返回包含T类型元素的列表
     */
    <S> List<T> getList(S param);

    /**
     * 获取列表。
     *
     * @param s     参数，用于生成列表的依据
     * @param clazz 需要获取的列表元素的类类型
     * @param <S>   泛型参数，表示传入参数的类型
     * @param <R>   泛型参数，表示返回列表中元素的类型
     * @return 返回包含指定类类型元素的列表
     */
    <S, R> List<R> getList(S s, Class<R> clazz);

    /**
     * 获取分页信息。
     *
     * @param clazz 需要获取分页信息的实体类类型
     * @param <P>   泛型参数，返回值类型
     * @return 返回包含分页信息的IPage对象
     */
    <P> IPage<P> getPage(Class<P> clazz);

    /**
     * 获取分页列表。
     *
     * @param param 查询参数，用于设置查询条件
     * @param <S>   泛型参数，表示传入参数的类型
     * @return 返回包含分页信息的IPage对象，其中包含T类型的元素
     */
    <S> IPage<T> getPage(S param);

    /**
     * 获取分页列表。
     *
     * @param s     用于设置查询条件
     * @param clazz 需要获取分页信息的实体类类型
     * @param <S>   泛型参数，条件类型
     * @param <R>   泛型参数，返回值类型
     * @return 返回包含分页信息的IPage对象，其中包含R类型的元素
     */
    <S, R> IPage<R> getPage(S s, Class<R> clazz);

    /**
     * 根据传入的参数和类类型获取一个对象。
     *
     * @param s     查询条件，用于获取单个对象
     * @param clazz 需要获取对象的类类型
     * @param <S>   泛型参数，表示传入参数的类型
     * @param <R>   泛型参数，表示返回对象的类型
     * @return 返回符合查询条件的单个对象
     */
    <S, R> R one(S s, Class<R> clazz);

    <S, R> R oneById(S id, Class<R> clazz);

    /**
     * 根据传入的参数获取一个对象。
     *
     * @param s 查询条件，用于获取单个对象
     * @param <S> 泛型参数，表示传入参数的类型
     * @return 返回符合查询条件的单个对象
     */
    <S> T one(S s);

    <P extends UpdateBase<?>> boolean updateByVo(P vo);

    <S> boolean exists(S id);
}
